package com.cy.java.OOP;


import com.cy.java.util.ReflectUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;


class Point{
    private int x;
    private int y;
  public  Point(int  x,int y){
        this.x=x;
        this.y=y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }



    public void setY(int y) {
        this.y = y;
    }

    @Override
    public String toString() {
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }

}

public class ReflectTests {
    public static void main(String[] args) throws Exception {
        //1.通过反射构建Point类型的实例对象
        //1.1获取反射应用的起点对象(类的字节码对象)
        Class<?> c1=Class.forName("com.cy.java.OOP.Point");
        //1.2基于字节码对象获取类的构造方法对象
        //要想获取这个类的实例需要有构造方法
//        Constructor<?> constructor = c1.getConstructor(int.class,int.class);
//        Object o1=  constructor.newInstance(10,20);
//        System.out.println(o1);
        //返回值还是这个对象的实例封装了上面的代码                  名字           值                     class
       Object o1= ReflectUtil.newInstance("com.cy.java.OOP.Point", new Object[]{10,20}, int.class,int.class);
        //2.通过反射为Point类shil的属性直接赋值
        Field f1=c1.getDeclaredField("x");
        f1.setAccessible(true);//设置访问
        f1.set(o1,1000);//为point对象的f1属性赋值为1000
        System.out.println(o1);
        //3.通过反射调用Point类的实例set方法为属性赋值
        Method setMethod=c1.getDeclaredMethod("setX", int.class);
        setMethod.invoke(o1,2000);//为o1对象的setMethod方法赋值为2000
        System.out.println(o1);
        //4.通过反射调用Point类的get方法获取属性值
        Method getMethod=c1.getMethod("getX");
        Object getResult=getMethod.invoke(o1);
        System.out.println(getResult);

    }
}
